package JavaEE.NetWork.TCP;

import java.io.*;
import java.util.*;
import java.net.*;

// TCP的客户端.
public class EchoClient {
    private Socket socket = null;
    // 因为TCP协议本身"有连接",也就代表"以服务器ip和端口号作为参数,交给操作系统直接建立连接"
    public EchoClient(String ip,int Port) throws IOException {
        socket = new Socket(ip,Port);
    }
    public void start() throws IOException{
        System.out.println("客户端启动!");
        Scanner in = new Scanner(System.in);
        try(InputStream inputStream = socket.getInputStream();
            OutputStream outputStream = socket.getOutputStream()) {
            // 创建一个Scanner对象,代表"客户端的输入流"->"服务器的输出流",用于接收响应
            Scanner scanner = new Scanner(inputStream);
            // 创建一个PrintWriter对象,代表"客户端的输出流"->"服务器的输入流",用于发送请求
            PrintWriter writer = new PrintWriter(outputStream);
            while (true) {
                System.out.printf("> ");
                // 1. 接受控制台上用户的输入
                String request = in.next();
                // 2. 将输入构造请求发送到服务器
                writer.println(request);
                // **- 问题一: writer.println(request); -**
                // 逻辑没有问题,但是这里println只是把数据先写到缓冲区中,没有真正的写入网卡,也就没有真正发送.
                // 计算机读写内存,比读写外设要快很多(缓冲区属于内存,网卡属于外设)
                // 假设要频繁写入多次,就会"先攒着,一次性写入到网卡"(类似于"膀胱"~)
                // 而想要解决,就需要我们"手动刷新缓冲区"~:flush()
                writer.flush();
                // 3. 接受服务器的响应
                // 如果没有收到响应.代表服务器断开了链接
                if(!scanner.hasNext()){
                    System.out.println("服务器断开了链接");
                    break;
                }
                String response = scanner.next();
                // 4. 将响应打印到控制台上
                System.out.println(response);
            }
        }
    }

    public static void main(String[] args) throws IOException{
        EchoClient echoClient = new EchoClient("127.0.0.1",9090);
        echoClient.start();
    }
}
